<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 1. json的使用


    // 2.深拷贝
    // 2.1 递归深拷贝
    // 声明一个对象
    // var obj1 = {
    //   name: "张三",
    //   age: 20
    // }
    // // var obj2 = obj1;
    // var obj2 = {};

    // for(var key in obj1){
    //   // console.log(key,obj1[key])
    //   // 把obj1里的键名和键值加入到obj2里
    //   obj2[key] = obj1[key];
    // }

    // // 如果 obj2是创建了新对象 那么obj1 和obj2 不是一个地址
    // obj2.age = 40;
    // console.log(obj1);
    // console.log(obj2);

    // 2.2  简单版本的深拷贝函数
    // function deepCopy (obj1) {
    //   var obj2 = {};
    //   for (var key in obj1) {
    //     // obj2
    //     // console.log(key,obj1[key])
    //     // 把obj1里的键名和键值加入到obj2里
    //     obj2[key] = obj1[key];
    //   }
    //   return obj2;
    // }
    // var obj1 = {
    //   name: "张三",
    //   age: 20
    // }
    // var obj2 = deepCopy(obj1);
    // obj2.age = 30;
    // console.log(obj1);
    // console.log(obj2);


    // 2.3 扩充深拷贝  深拷贝数组或对象
    // function deepCopy (obj1) {
    //   // var obj2 = {};
    //   // var obj2 = [];
    //   // 根据传入的数据自动生成数组或者是对象
    //   var obj2 = Object.prototype.toString.call(obj1) === "[object Array]" ? [] : {};
    //   for (var key in obj1) {
    //     // 把obj1里的键名和键值加入到obj2里
    //     obj2[key] = obj1[key];
    //   }
    //   return obj2;
    // }
    // var arr = [1,2,3];
    // var obj = { name: "张三", age: 20 }
    // // 2.3.1 传入的是对象
    // // var newarr = deepCopy(obj);
    // // 2.3.2 传入的是数组
    // var newarr = deepCopy(arr);
    // console.log(newarr);


    // 2.4  多层数据及对象的问题 
    // function deepCopy (obj1) {
    //   // 这里的问题  obj1 是两层结构 里面还有一层对象
    //   // 第二层对象还会引用之前的地址  
    //   var obj2 = Object.prototype.toString.call(obj1) === "[object Array]" ? [] : {};
    //   for (var key in obj1) {
    //     // 把obj1里的键名和键值加入到obj2里
    //     obj2[key] = obj1[key];
    //   }
    //   return obj2;
    // }
    // var obj1 = {
    //   name: "张三",
    //   hobby: {
    //     name1: "篮球",
    //     name2: "足球"
    //   }
    // }
    // var obj2 = deepCopy(obj1);
    // console.log(obj2);
    // obj2.name = "李四";
    // // obj2.hobby.name1 = "乒乓球";
    // console.log(obj2);
    // console.log(obj1);




    //  3. 补充判断数据类型
    // 3.1 typeof  不能判断 对象 和数组 
    // var arr = [];
    // var obj = {};
    // console.log(typeof arr);
    // console.log(typeof obj);

    // 3.2  instanceof 判断某个实例 和构造器 在原型链上是否有关系；
    // console.log(arr instanceof Array);
    // console.log(arr instanceof Object);
    // console.log(obj instanceof Object);

    // 3.3 Object.prototype.toString.call
    // ES5 精确判断数据类型  什么数据类型都可以判断
    var arr = []
    var obj = {}
    console.log(Object.prototype.toString.call(arr));
    console.log(Object.prototype.toString.call(obj));
  </script>
</body>

</html>